package com.cencat.user.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.cencat.user.entity.Role;
import com.cencat.user.dto.RoleQueryDTO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

import java.util.List;

/**
 * 角色Mapper接口
 * @author cencat
 * @since 2024-01-01
 */
@Mapper
public interface RoleMapper extends BaseMapper<Role> {

    /**
     * 分页查询角色列表
     * @param page 分页参数
     * @param queryDTO 查询条件
     * @return 角色列表
     */
    IPage<Role> selectRolePage(IPage<Role> page, @Param("query") RoleQueryDTO queryDTO);

    /**
     * 查询角色列表
     * @param queryDTO 查询条件
     * @return 角色列表
     */
    List<Role> selectRoleList(@Param("query") RoleQueryDTO queryDTO);

    /**
     * 根据用户ID查询角色列表
     * @param userId 用户ID
     * @param tenantId 租户ID
     * @return 角色列表
     */
    @Select("SELECT r.* FROM role r INNER JOIN user_role ur ON r.id = ur.role_id " +
            "WHERE ur.user_id = #{userId} AND r.tenant_id = #{tenantId} ORDER BY r.create_time DESC")
    List<Role> selectRolesByUserId(@Param("userId") Long userId, @Param("tenantId") Long tenantId);

    /**
     * 根据权限ID查询角色列表
     * @param permissionId 权限ID
     * @param tenantId 租户ID
     * @return 角色列表
     */
    List<Role> selectRolesByPermissionId(@Param("permissionId") Long permissionId, @Param("tenantId") Long tenantId);

    /**
     * 根据租户ID查询角色列表
     * @param tenantId 租户ID
     * @return 角色列表
     */
    @Select("SELECT * FROM role WHERE tenant_id = #{tenantId} ORDER BY create_time DESC")
    List<Role> selectRolesByTenantId(@Param("tenantId") Long tenantId);

    /**
     * 检查角色编码是否存在
     * @param roleCode 角色编码
     * @param excludeId 排除的角色ID
     * @param tenantId 租户ID
     * @return 存在数量
     */
    Long checkRoleCodeExists(@Param("roleCode") String roleCode, @Param("excludeId") Long excludeId, @Param("tenantId") Long tenantId);

    /**
     * 检查角色名称是否存在
     * @param roleName 角色名称
     * @param excludeId 排除的角色ID
     * @param tenantId 租户ID
     * @return 存在数量
     */
    Long checkRoleNameExists(@Param("roleName") String roleName, @Param("excludeId") Long excludeId, @Param("tenantId") Long tenantId);

    /**
     * 统计角色数量
     * @param queryDTO 查询条件
     * @return 角色数量
     */
    Long countRoles(@Param("query") RoleQueryDTO queryDTO);

    /**
     * 根据角色编码查询角色
     * @param roleCode 角色编码
     * @param tenantId 租户ID
     * @return 角色信息
     */
    Role selectByRoleCode(@Param("roleCode") String roleCode, @Param("tenantId") Long tenantId);

    /**
     * 根据角色名称查询角色
     * @param roleName 角色名称
     * @param tenantId 租户ID
     * @return 角色信息
     */
    Role selectByRoleName(@Param("roleName") String roleName, @Param("tenantId") Long tenantId);

}